//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2023/05/06
// Design Name:
// Module Name: sdpram
// Project Name: wujian100
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////

module sdpram
   #(
    parameter                   ADDR_W = 12
    )
    (//a端口可写可读
    input                 [1  - 1 : 0] a_clk_i,
	  input                 [1  - 1 : 0] a_rst_n_i,
    input                 [1  - 1 : 0] a_en_i,
	  input                 [1  - 1 : 0] a_write_i,
	  input             [ADDR_W - 1 : 0] a_addr_i,
    //b端口只能读
    input                 [1  - 1 : 0] b_clk_i,
	  input                 [1  - 1 : 0] b_rst_n_i,
    input                 [1  - 1 : 0] b_en_i,
	  input             [ADDR_W - 1 : 0] b_addr_i,
    //公共端口
    input                 [32 - 1 : 0] wdat_i,
	  output                [32 - 1 : 0] a_rdat_o,
    output                [32 - 1 : 0] b_rdat_o
    );

localparam MEM_INDEX_W                 = ADDR_W-2;                             //索引值位宽 
localparam MEM_DEP                     = 16;                                   //内存空间的深度 原值 {{(ADDR_W){1'b0}},{1'b1}}<<MEM_INDEX_W

reg                           [32-1:0] mem [MEM_DEP-1:0];                      //32bit寄存器组
reg                           [32-1:0] a_rdat_r;                               //读数据信号
reg                           [32-1:0] b_rdat_r;                               //读数据信号
wire                 [MEM_INDEX_W-1:0] w_mem_index_w;                          //32bit寄存器组读数据索引值
wire                 [MEM_INDEX_W-1:0] r_mem_index_w;                          //32bit寄存器组读数据索引值

//////////////////////////////////////
//中断控制信号                       //
//////////////////////////////////////

genvar index;

//////////////////////////////////////
//写寄存器信号                       //
//////////////////////////////////////

assign w_mem_index_w    = a_addr_i>>2;                                         //将地址转换为mem的索引值

//////////////////////////////////////
//读寄存器信号                       //
//////////////////////////////////////
assign r_mem_index_w    = b_addr_i>>2;                                         //将地址转换为mem的索引值
assign a_rdat_o         = a_rdat_r;                                            //输出读数据
assign b_rdat_o         = b_rdat_r;                                            //输出读数据
/************************************/
/*写寄存器操作                       */
/************************************/

generate
  for (index = 0; index < MEM_DEP ; index = index + 1)
  begin : MEM_LOOP
  always@(posedge a_clk_i or negedge a_rst_n_i)
  begin : MEM_PROG
    if (a_rst_n_i == 1'b0)
	    mem[index]             <= {(32){1'b0}};
	  else if ((a_en_i == 1'b1)&&(a_write_i == 1'b1)&&(index == {{(32-ADDR_W){1'b0}},{w_mem_index_w}}))
	    mem[index]      <= wdat_i;
	  else
	    mem[index]      <= mem[index];
  end
  end
endgenerate

/************************************/
/*读寄存器操作                       */
/************************************/

always@(*)
begin : A_RDAT_R_PROG
  if ((a_en_i == 1'b1)&&(a_write_i == 1'b0))
    a_rdat_r            = mem[w_mem_index_w];
  else
    a_rdat_r            = {(32){1'b0}};
end

always@(*)
begin : B_RDAT_R_PROG
  if (b_en_i == 1'b1)
    b_rdat_r            = mem[r_mem_index_w];
  else
    b_rdat_r            = {(32){1'b0}};
end

endmodule


  // \begin{longtable}{|c|c|c|p{8cm}|}
	// \caption{rm_ree2tee_box模块接口}\\
	// % 表格“首页”显示内容
	// \toprule
	// 信号名称           & 方向    & 位数  & 描述     \\ \hline
	// \midrule
	// \endfirsthead
	// % “后续页面”表头显示内容
	// \multicolumn{4}{r}{Continued}\\
	// \toprule
	// 信号名称           & 方向    & 位数  & 描述     \\ \hline
	// %\midrule
	// \endhead
  //       a_clk_i      & input  & 1    & a端口信箱寄存器时钟 \\ \hline       
  //       a_rst_n_i    & input  & 1    & a端口信箱寄存器复位信号，低电平有效      \\ \hline     
  //       a_en_i       & input  & 1    & a端口信箱寄存器使能信号，高电平有效     \\ \hline 
  //       a_write_i    & input  & 1    & a端口信箱寄存器读写控制信号，高电平为写，低电平为读     \\ \hline    
  //       a_addr_i     & input  & 19   & a端口信箱寄存器地址信号     \\ \hline     
  //       b_clk_i      & input  & 1    & b端口信箱寄存器时钟     \\ \hline     
  //       b_rst_n_i    & input  & 1    & b端口信箱寄存器复位信号，低电平有效     \\ \hline    
  //       b_en_i       & input  & 1    & b端口信箱寄存器使能信号，高电平有效     \\ \hline     
  //       b_addr_i     & input  & 19   & b端口信箱寄存器地址信号     \\ \hline     
  //       wdat_i       & input  & 32   & 信箱寄存器写数据信号     \\ \hline    
  //       a_rdat_o     & output & 32   & a端口信箱寄存器读数据信号     \\ \hline     
  //       b_rdat_o     & output & 32   & b端口信箱寄存器读数据信号     \\ \hline  
  //   \end{longtable}


























            
               
              
             
               
            
              
            
              
              